package com.hmall.controller;


import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.domain.PageDTO;
import com.hmall.domain.dto.ItemDTO;
import com.hmall.domain.po.Item;
import com.hmall.domain.query.ItemPageQuery;
import com.hmall.service.IItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "搜索相关接口")
@RestController
@RequestMapping("/search")
@RequiredArgsConstructor
public class SearchController {

    private final IItemService itemService;

    @ApiOperation("搜索商品")
    @GetMapping("/list")
    public PageDTO<ItemDTO> search(ItemPageQuery query) {
        // TODO 根据条件分页查询，默认根据更新时间降序排序\
        //
        LambdaQueryChainWrapper<Item> le = itemService.lambdaQuery()
                .like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
                .eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
                .eq(StrUtil.isNotBlank(query.getCategory()), Item::getCategory, query.getCategory())
                .eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
                .ge(query.getMinPrice() != null, Item::getPrice, query.getMinPrice())
                .le(query.getMaxPrice() != null, Item::getPrice, query.getMaxPrice());
        if (StrUtil.isNotBlank(query.getSortBy()))
        {
            switch (query.getSortBy()) {
                case "price":
                    le.orderBy(true, query.getIsAsc(), Item::getPrice);
                    break;
                case "sold":
                    le.orderBy(true, query.getIsAsc(), Item::getSold);
                    break;
                default:
                    le.orderBy(true, query.getIsAsc(), Item::getUpdateTime);
                    break;
            }
        }
        else
        {
            le.orderBy(true, query.getIsAsc(), Item::getUpdateTime);
        }
        Page<Item> page = le.page(Page.of(query.getPageNo(), query.getPageSize()));
        return PageDTO.of(page, ItemDTO.class);


//        // 创建一个Lambda查询链包装器，用于构建商品查询条件
//        LambdaQueryChainWrapper<Item> queryWrapper = itemService.lambdaQuery()
//                // 当查询关键字不为空时，添加名称模糊查询条件
//                .like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
//                // 当分类不为空时，添加分类相等查询条件
//                .eq(StrUtil.isNotBlank(query.getCategory()), Item::getCategory, query.getCategory())
//                // 当品牌不为空时，添加品牌相等查询条件
//                .eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
//                // 当最低价格不为空时，添加价格大于等于查询条件
//                .ge(query.getMinPrice() != null, Item::getPrice, query.getMinPrice())
//                // 当最高价格不为空时，添加价格小于等于查询条件
//                .le(query.getMaxPrice() != null, Item::getPrice, query.getMaxPrice())
//                // 默认按更新时间降序排序
//                .orderByDesc(Item::getUpdateTime);
//        // 根据用户指定的排序字段进行排序
//        if (query.getSortBy() != null) {
//            switch (query.getSortBy()) {
//                // 按价格排序
//                case "price":
//                    queryWrapper.orderBy(true, query.getIsAsc(), Item::getPrice);
//                    break;
//                // 按销量排序
//                case "sold":
//                    queryWrapper.orderBy(true, query.getIsAsc(), Item::getSold);
//                    break;
//                // 默认按更新时间排序
//                default:
//                    queryWrapper.orderBy(true, query.getIsAsc(), Item::getUpdateTime);
//                    break;
//            }
//        } else {
//            // 如果未指定排序字段，则默认按更新时间排序
//            queryWrapper.orderBy(true, query.getIsAsc(), Item::getUpdateTime);
//        }
//        // 执行分页查询，并返回分页结果
//        Page<Item> page = queryWrapper.page(new Page<>(query.getPageNo(), query.getPageSize()));
//        // 将分页结果转换为DTO并返回
//        return PageDTO.of(page, ItemDTO.class);
    }
}
